package com.atguigu.gmall.task.job;

import com.atguigu.gmall.common.rabbit.config.MqConst;
import com.atguigu.gmall.common.rabbit.service.RabbitService;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author: atguigu
 * @create: 2023-05-13 11:01
 */
@Slf4j
@Component
public class SeckillJob {

    @XxlJob("myJob")
    public void testJob() {
        log.info("my job running...");
    }


    @Autowired
    private RabbitService rabbitService;

    /**
     * 定时任务:
     * 每天凌晨一点发送消息,触发秒杀商品预热
     * 测试
     * 克隆表达式:秒 分 时 日(天) 月 周 年
     */
    @XxlJob("sendImpSeckGoodsMsg")
    public void sendImpSeckGoodsMsg() {
        log.info("[任务服务]执行发送秒杀商品入库消息");
        rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_TASK, MqConst.ROUTING_TASK_1, "");
    }


    /**
     * 每天下午6结束秒杀,通知秒杀服务清理当日秒杀产生缓存数据
     */
    @XxlJob("sendClearSeckillGoodsCache")
    public void sendClearSeckillGoodsCache() {
        String jobParam = XxlJobHelper.getJobParam();
        log.info("获取到定时任务入参:{}", jobParam);
        rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_TASK, MqConst.ROUTING_TASK_18, "");
    }

    /**
     * 执行器集群部署时，任务路由策略选择”分片广播”情况下，一次任务调度将会广播触发对应集群中所有执行器执行一次任务，同时系统自动传递分片参数；可根据分片参数开发分片任务；
     * “分片广播” 以执行器为维度进行分片，支持动态扩容执行器集群从而动态增加分片数量，协同进行业务处理；在进行大数据量业务操作时可显著提升任务处理能力和速度。
     * “分片广播” 和普通任务开发流程一致，不同之处在于可以获取分片参数，获取分片参数进行分片业务处理。
     * 分片任务:需要给数据库中30W会员发送营销短信
     */
    @XxlJob("shardJob")
    public void shardJob() {
    // 可参考Sample示例执行器中的示例任务"ShardingJobHandler"了解试用
        int shardTotal = XxlJobHelper.getShardTotal();
        log.info("总执行器数量/分片数量:{}", shardTotal);
        int shardIndex = XxlJobHelper.getShardIndex();
        log.info("当前执行器索引:{}", shardIndex);
    }
}
